<?php

//定义观察者接口
interface Observer
{
    public function insert($postData);

    public function update($postData);
}

class AdminObServer implements Observer
{
    public function insert($postData)
    {
        echo "这里收到管理员insert插入通知\n";
    }

    public function update($postData)
    {
        echo "这里收到管理员update插入通知\n";
    }
}

class UserObServer implements Observer
{
    public function insert($postData)
    {
        echo "这里收到用户insert插入通知\n";
    }

    public function update($postData)
    {
        echo "这里收到用户update插入通知\n";
    }
}

class FormPost
{
    //被观察者（论坛帖子类）
    private $observers;

    public function attach(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    public function publishPost($data)
    {
        echo "插入了帖子发布的操作......\n";
        foreach ($this->observers as $observer) {
            //通知观察者（比如对用于进行通知,发短信，发邮件）
            $observer->update($data);
        }
    }
}

$form = new FormPost();
$admin = new AdminObServer();
$user = new UserObServer();
$form->attach($admin);
$form->attach($user);
$form->publishPost(['title' => '通知测试']);
/*
    以下是对 PHP 观察者模式的详细解释：
    观察者（Observer）：实现了特定接口（通常包含一个insert或者update方法）的类，用于接收被观察者的通知并进行相应的处理。
    被观察者（Subject）：拥有一些状态，当这些状态发生改变时，会通知注册的观察者。
    在项目中的应用场景例如：
    案例1：假设我们正在开发一个在线论坛系统。当有新帖子发布时，需要通知管理员、版主和订阅了该板块的用户。
    在这个例子中，当新帖子发布时，管理员和用户都会收到通知，并做出相应的处理。 （代码参考）
    案例2：在一个电商平台中，当商品的库存数量发生变化时，多个相关的模块（如库存管理系统、订单处理系统、前端展示页面等）可以作为观察者接收到通知并进行相应的处理，而无需彼此之间直接调用和依赖。
    观察者模式的优点包括：
    解耦了被观察者和观察者，使它们可以独立变化和扩展，支持广播通信，方便同时通知多个观察者，增强了系统的灵活性和可维护性。
 */
